<?php

namespace app\service\http\google;

use hunma\exception\ApiException;
use hunma\utils\guzzle\BaseHttpClient;
use support\Log;

/**
 * Google API 客户端
 * 继承自通用HttpClient，针对Google API进行了特殊优化
 */
class GoogleApiClient extends BaseHttpClient
{
    /**
     * Google API 密钥
     * @var string
     */
    protected $apiKey;

    /**
     * API 基础URL
     * @var string
     */
    protected $baseUrl = 'https://www.googleapis.com';

    /**
     * 构造函数
     *
     * @param string $apiKey Google API密钥
     * @param array $config HTTP客户端配置
     */
    public function __construct(array $config = [])
    {
        $this->apiKey = $config['key'] ?? getenv('GOOGLE_API_KEY', 'AIzaSyBzOaSDgKN7HMEAmprwG8eSu10a0MnoiZ4');
        $this->baseUrl = $config['url'] ?? getenv('GOOGLE_API_MAPS_URL', 'https://www.googleapis.com');

        // 确保记录用户标识和时间戳在日志中
        $config['headers'] = array_merge($config['headers'] ?? [], [
            'X-Client-ID' => 'yzt',
            'X-Request-Time' => date('Y-m-d H:i:s')
        ]);

        $proxyEnable = getenv('HTTP_PROXY_ENABLE');
        if($proxyEnable) {
            $proxyHost = getenv('HTTP_PROXY_HOST');
            $proxyPort = getenv('HTTP_PROXY_PORT', '7890');
            $config['proxy'] = "{$proxyHost}:{$proxyPort}";
        }

        parent::__construct($config);

        // 设置默认查询参数包含API密钥
        $this->defaultOptions['query']['key'] = $this->apiKey;
    }

    /**
     * 发送GET请求到Google API
     *
     * @param string $endpoint API端点
     * @param array $params 查询参数
     * @param array $headers 请求头
     * @return mixed 响应数据
     */
    public function get($endpoint, array $params = [], array $headers = [], array $options = [])
    {
        $url = $this->buildUrl($endpoint);

        // 默认加上key
        $params['key'] = $this->apiKey;

        return parent::get($url, $params, $headers, $options);
    }

    /**
     * 发送POST请求到Google API（JSON数据）
     *
     * @param string $endpoint API端点
     * @param array $data 请求数据
     * @param array $headers 请求头
     * @return mixed 响应数据
     */
    public function post($endpoint, array $data = [], array $headers = [])
    {
        $url = $this->buildUrl($endpoint);
        return parent::postJson($url, $data, $headers);
    }

    /**
     * 构建完整的API URL
     *
     * @param string $endpoint API端点
     * @return string 完整URL
     */
    protected function buildUrl($endpoint)
    {
        // 如果端点已经是完整URL，则直接返回
        if (strpos($endpoint, 'http://') === 0 || strpos($endpoint, 'https://') === 0) {
            return $endpoint;
        }

        // 确保端点以斜杠开头
        if (strpos($endpoint, '/') !== 0) {
            $endpoint = '/' . $endpoint;
        }

        return $this->baseUrl . $endpoint;
    }

    /**
     * 处理Google API特定的响应解析
     * 重写父类方法以适应Google API的特定响应格式
     *
     * @param string $body 响应体
     * @return array|null 解析后的响应数据
     */
    protected function parseJsonResponse($body)
    {
        $data = parent::parseJsonResponse($body);

        // 检查Google API特有的错误格式
        if (isset($data['error'])) {
            // 记录详细的错误信息
            Log::channel('guzzlehttp')->error("Google API错误", [
                'error' => $data['error'],
                'time' => date('Y-m-d H:i:s')
            ]);
        }

        return $data;
    }
}